use cargo::ops;
use cargo::core::MultiShell;
use cargo::util::{CliResult, CliError};
-use cargo::util::important_paths::find_project;
+use cargo::util::important_paths::find_project_manifest;
#[deriving(PartialEq,Clone,Decodable,Encodable)]
pub struct Options {
let root = match options.manifest_path {
Some(path) => Path::new(path),
- None => try!(find_project(os::getcwd(), "Cargo.toml")
- .map(|path| path.join("Cargo.toml"))
+ None => try!(find_project_manifest(&os::getcwd(), "Cargo.toml")
.map_err(|_| {
CliError::new("Could not find Cargo.toml in this \
directory or any parent directory",
use cargo::core::{MultiShell};
use cargo::util;
use cargo::util::{CliResult, CliError};
-use cargo::util::important_paths::find_project;
+use cargo::util::important_paths::find_project_manifest;
#[deriving(PartialEq,Clone,Decodable)]
struct Options {
fn execute(options: Options, shell: &mut MultiShell) -> CliResult<Option<()>> {
let root = match options.manifest_path {
Some(path) => Path::new(path),
- None => try!(find_project(os::getcwd(), "Cargo.toml")
- .map(|path| path.join("Cargo.toml"))
+ None => try!(find_project_manifest(&os::getcwd(), "Cargo.toml")
.map_err(|_| {
CliError::new("Could not find Cargo.toml in this \
directory or any parent directory",
}
fn locate_project(_: NoFlags, _: &mut MultiShell) -> CliResult<Option<ProjectLocation>> {
- let root = try!(find_project(os::getcwd(), "Cargo.toml").map_err(|e| {
+ let root = try!(find_project(&os::getcwd(), "Cargo.toml").map_err(|e| {
CliError::from_boxed(e, 1)
}));
use util::{CargoResult, human};
-pub fn find_project(pwd: Path, file: &str) -> CargoResult<Path> {
+/// Iteratively search for `file` in `pwd` and its parents, returning
+/// the path of the directory.
+pub fn find_project(pwd: &Path, file: &str) -> CargoResult<Path> {
+ find_project_manifest(pwd, file)
+ .map(|mut p| {
+ // remove the file, leaving just the directory
+ p.pop();
+ p
+ })
+}
+
+/// Iteratively search for `file` in `pwd` and its parents, returning
+/// the path to the file.
+pub fn find_project_manifest(pwd: &Path, file: &str) -> CargoResult<Path> {
let mut current = pwd.clone();
loop {
- if current.join(file.clone()).exists() {
- return Ok(current)
+ let manifest = current.join(file);
+ if manifest.exists() {
+ return Ok(manifest)
}
if !current.pop() { break; }
}
- Err(human(format!("no manifest found in `{}`", pwd.display())))
+ Err(human(format!("Could not find `{}` in `{}` or any parent directory",
+ file, pwd.display())))
+}
+
+/// Return the path to the `file` in `pwd`, if it exists.
+pub fn find_project_manifest_exact(pwd: &Path, file: &str) -> CargoResult<Path> {
+ let manifest = pwd.join(file);
+
+ if manifest.exists() {
+ Ok(manifest)
+ } else {
+ Err(human(format!("Could not find `{}` in `{}`",
+ file, pwd.display())))
+ }
}